home *** CD-ROM | disk | FTP | other *** search
/ Wonky Flux Batch 2019 02 / Wonky_Flux_Batch_2019-02.zip / Wonky Flux Batch 2019-02 / 089 - Misc Stuff - PD.dsk / SWEET 16.S < prev    next >
Text File  |  2019-02-17  |  8KB  |  254 lines

  1. ********************************
  2. *                              *
  3. *   APPLE-II  PSEUDO MACHINE   *
  4. *         INTERPRETER          *
  5. *                              *
  6. *      COPYRIGHT (C) 1977      *
  7. *     APPLE COMPUTER,  INC     *
  8. *                              *
  9. *     ALL  RIGHTS RESERVED     *
  10. *                              *
  11. *         S. WOZNIAK           *
  12. *                              *
  13. ********************************
  14. *                              *
  15. * TITLE:  SWEET 16 INTERPRETER *
  16. *                              *
  17. ********************************
  18.  
  19. R0L       EQU $0
  20. R0H       EQU $1
  21. R14H      EQU $1D
  22. R15L      EQU $1E
  23. R15H      EQU $1F
  24. SAVE      EQU $FF4A
  25. RESTORE   EQU $FF3F
  26.  
  27.           ORG $F689
  28.  
  29.           AST 32
  30.  
  31.           JSR SAVE       ;PRESERVE 6502 REG CONTENTS
  32.           PLA
  33.           STA R15L       ;INIT SWEET16 PC
  34.           PLA            ;FROM RETURN
  35.           STA R15H       ;ADDRESS
  36. SW16B     JSR SW16C      ;INTERPRET AND EXECUTE
  37.           JMP SW16B      ;ONE SWEET16 INSTR.
  38. SW16C     INC R15L
  39.           BNE SW16D      ;INCR SWEET16 PC FOR FETCH
  40.           INC R15H
  41. SW16D     LDA #>SET      ;COMMON HIGH BYTE FOR ALL ROUTINES
  42.           PHA            ;PUSH ON STACK FOR RTS
  43.           LDY #$0
  44.           LDA (R15L),Y   ;FETCH INSTR
  45.           AND #$F        ;MASK REG SPECIFICATION
  46.           ASL            ;DOUBLE FOR TWO BYTE REGISTERS
  47.           TAX            ;TO X REG FOR INDEXING
  48.           LSR
  49.           EOR (R15L),Y   ;NOW HAVE OPCODE
  50.           BEQ TOBR       ;IF ZERO THEN NON-REG OP
  51.           STX R14H       ;INDICATE "PRIOR RESULT REG"
  52.           LSR
  53.           LSR            ;OPCODE*2 TO LSB'S
  54.           LSR
  55.           TAY            ;TO Y REG FOR INDEXING
  56.           LDA OPTBL-2,Y  ;LOW ORDER ADR BYTE
  57.           PHA            ;ONTO STACK
  58.           RTS            ;GOTO REG-OP ROUTINE
  59. TOBR      INC R15L
  60.           BNE TOBR2      ;INCR PC
  61.           INC R15H
  62. TOBR2     LDA BRTBL,X    ;LOW ORDER ADR BYTE
  63.           PHA            ;ONTO STACK FOR NON-REG OP
  64.           LDA R14H       ;"PRIOR RESULT REG" INDEX
  65.           LSR            ;PREPARE CARRY FOR BC, BNC.
  66.           RTS            ;GOTO NON-REG OP ROUTINE
  67. RTNZ      PLA            ;POP RETURN ADDRESS
  68.           PLA
  69.           JSR RESTORE    ;RESTORE 6502 REG CONTENTS
  70.           JMP (R15L)     ;RETURN TO 6502 CODE VIA PC
  71. SETZ      LDA (R15L),Y   ;HIGH ORDER BYTE OF CONSTANT
  72.           STA R0H,X
  73.           DEY
  74.           LDA (R15L),Y   ;LOW ORDER BYTE OF CONSTANT
  75.           STA R0L,X
  76.           TYA            ;Y REG CONTAINS 1
  77.           SEC
  78.           ADC R15L       ;ADD 2 TO PC
  79.           STA R15L
  80.           BCC SET2
  81.           INC R15H
  82. SET2      RTS
  83. OPTBL     DFB SET-1      ;1X
  84. BRTBL     DFB RTN-1      ;0
  85.           DFB LD-1       ;2X
  86.           DFB BR-1       ;1
  87.           DFB ST-1       ;3X
  88.           DFB BNC-1      ;2
  89.           DFB LDAT-1     ;4X
  90.           DFB BC-1       ;3
  91.           DFB STAT-1     ;5X
  92.           DFB BP-1       ;4
  93.           DFB LDDAT-1    ;6X
  94.           DFB BM-1       ;5
  95.           DFB STDAT-1    ;7X
  96.           DFB BZ-1       ;6
  97.           DFB POP-1      ;8X
  98.           DFB BNZ-1      ;7
  99.           DFB STPAT-1    ;9X
  100.           DFB BM1-1      ;8
  101.           DFB ADD-1      ;AX
  102.           DFB BNM1-1     ;9
  103.           DFB SUB-1      ;BX
  104.           DFB BK-1       ;A
  105.           DFB POPD-1     ;CX
  106.           DFB RS-1       ;B
  107.           DFB CPR-1      ;DX
  108.           DFB BS-1       ;C
  109.           DFB INR-1      ;EX
  110.           DFB NUL-1      ;D
  111.           DFB DCR-1      ;FX
  112.           DFB NUL-1      ;E
  113.           DFB NUL-1      ;UNUSED
  114.           DFB NUL-1      ;F
  115.  
  116. * FOLLOWING CODE MUST BE
  117. * CONTAINED ON A SINGLE PAGE!
  118.  
  119. SET       BPL SETZ       ;ALWAYS TAKEN
  120. LD        LDA R0L,X
  121. BK        EQU *-1
  122.           STA R0L
  123.           LDA R0H,X      ;MOVE RX TO R0
  124.           STA R0H
  125.           RTS
  126. ST        LDA R0L
  127.           STA R0L,X      ;MOVE R0 TO RX
  128.           LDA R0H
  129.           STA R0H,X
  130.           RTS
  131. STAT      LDA R0L
  132. STAT2     STA (R0L,X)    ;STORE BYTE INDIRECT
  133.           LDY #$0
  134. STAT3     STY R14H       ;INDICATE R0 IS RESULT NEG
  135. INR       INC R0L,X
  136.           BNE INR2       ;INCR RX
  137.           INC R0H,X
  138. INR2      RTS
  139. LDAT      LDA (R0L,X)    ;LOAD INDIRECT (RX)
  140.           STA R0L        ;TO R0
  141.           LDY #$0
  142.           STY R0H        ;ZERO HIGH ORDER R0 BYTE
  143.           BEQ STAT3      ;ALWAYS TAKEN
  144. POP       LDY #$0        ;HIGH ORDER BYTE = 0
  145.           BEQ POP2       ;ALWAYS TAKEN
  146. POPD      JSR DCR        ;DECR RX
  147.           LDA (R0L,X)    ;POP HIGH ORDER BYTE @RX
  148.           TAY            ;SAVE IN Y REG
  149. POP2      JSR DCR        ;DECR RX
  150.           LDA (R0L,X)    ;LOW ORDER BYTE
  151.           STA R0L        ;TO R0
  152.           STY R0H
  153. POP3      LDY #$0        ;INDICATE R0 AS LAST RESULT REG
  154.           STY R14H
  155.           RTS
  156. LDDAT     JSR LDAT       ;LOW ORDER BYTE TO R0, INCR RX
  157.           LDA (R0L,X)    ;HIGH ORDER BYTE TO R0
  158.           STA R0H
  159.           JMP INR        ;INCR RX
  160. STDAT     JSR STAT       ;STORE INDIRECT LOW ORDER
  161.           LDA R0H        ;BYTE AND INCR RX. THEN
  162.           STA (R0L,X)    ;STORE HIGH ORDER BYTE.
  163.           JMP INR        ;INCR RX AND RETURN
  164. STPAT     JSR DCR        ;DECR RX
  165.           LDA R0L
  166.           STA (R0L,X)    ;STORE R0 LOW BYTE @RX
  167.           JMP POP3       ;INDICATE R0 AS LAST RESULT REG
  168. DCR       LDA R0L,X
  169.           BNE DCR2       ;DECR RX
  170.           DEC R0H,X
  171. DCR2      DEC R0L,X
  172.           RTS
  173. SUB       LDY #$0        ;RESULT TO R0
  174. CPR       SEC            ;NOTE Y REG = 13*2 FOR CPR
  175.           LDA R0L
  176.           SBC R0L,X
  177.           STA R0L,Y      ;R0-RX TO RY
  178.           LDA R0H
  179.           SBC R0H,X
  180. SUB2      STA R0H,Y
  181.           TYA            ;LAST RESULT REG*2
  182.           ADC #$0        ;CARRY TO LSB
  183.           STA R14H
  184.           RTS
  185. ADD       LDA R0L
  186.           ADC R0L,X
  187.           STA R0L        ;R0+RX TO R0
  188.           LDA R0H
  189.           ADC R0H,X
  190.           LDY #$0        ;R0 FOR RESULT
  191.           BEQ SUB2       ;FINISH ADD
  192. BS        LDA R15L       ;NOTE X REG IS 12*2!
  193.           JSR STAT2      ;PUSH LOW PC BYTE VIA R12
  194.           LDA R15H
  195.           JSR STAT2      ;PUSH HIGH ORDER PC BYTE
  196. BR        CLC
  197. BNC       BCS BNC2       ;NO CARRY TEST
  198. BR1       LDA (R15L),Y   ;DISPLACEMENT BYTE
  199.           BPL BR2
  200.           DEY
  201. BR2       ADC R15L       ;ADD TO PC
  202.           STA R15L
  203.           TYA
  204.           ADC R15H
  205.           STA R15H
  206. BNC2      RTS
  207. BC        BCS BR
  208.           RTS
  209. BP        ASL            ;DOUBLE RESULT-REG INDEX
  210.           TAX            ;TO X REG FOR INDEXING
  211.           LDA R0H,X      ;TEST FOR PLUS
  212.           BPL BR1        ;BRANCH IF SO
  213.           RTS
  214. BM        ASL            ;DOUBLE RESULT-REG INDEX
  215.           TAX
  216.           LDA R0H,X      ;TEST FOR MINUS
  217.           BMI BR1
  218.           RTS
  219. BZ        ASL            ;DOUBLE RESULT-REG INDEX
  220.           TAX
  221.           LDA R0L,X      ;TEST FOR ZERO
  222.           ORA R0H,X      ;(BOTH BYTES)
  223.           BEQ BR1        ;BRANCH IF SO
  224.           RTS
  225. BNZ       ASL            ;DOUBLE RESULT-REG INDEX
  226.           TAX
  227.           LDA R0L,X      ;TEST FOR NON-ZERO
  228.           ORA R0H,X      ;(BOTH BYTES)
  229.           BNE BR1        ;BRANCH IF SO
  230.           RTS
  231. BM1       ASL            ;DOUBLE RESULT-REG INDEX
  232.           TAX
  233.           LDA R0L,X      ;CHECK BOTH BYTES
  234.           AND R0H,X      ;FOR $FF (MINUS 1)
  235.           EOR #$FF
  236.           BEQ BR1        ;BRANCH IF SO
  237.           RTS
  238. BNM1      ASL            ;DOUBLE RESULT-REG INDEX
  239.           TAX
  240.           LDA R0L,X
  241.           AND R0H,X      ;CHECK BOTH BYTES FOR NO $FF
  242.           EOR #$FF
  243.           BNE BR1        ;BRANCH IF NOT MINUS 1
  244. NUL       RTS
  245. RS        LDX #$18       ;12*2 FOR R12 AS STACK POINTER
  246.           JSR DCR        ;DECR STACK POINTER
  247.           LDA (R0L,X)    ;POP HIGH RETURN ADDRESS TO PC
  248.           STA R15H
  249.           JSR DCR        ;SAME FOR LOW ORDER BYTE
  250.           LDA (R0L,X)
  251.           STA R15L
  252.           RTS
  253. RTN       JMP RTNZ
  254.